﻿Type.registerNamespace("MoniMisi2");

MoniMisi2.Numero = function(element) {
    MoniMisi2.Numero.initializeBase(this, [element]);
    this.Funciones = new MoniMisi2.Funciones();
    this.Tipo = null;
    this.Enteros = null;
    this.Decimales = null;
    this.Relleno = null;
    this.PermiteNegativos = null;
    this.PuntoDecimal = Sys.CultureInfo.CurrentCulture.numberFormat.NumberDecimalSeparator;
    this.Espacios = null;
    this.Prefijo = null;
    this.Signo = null;
    this.DelFoco = null;
    this.DelBlur = null;
    this.DelKeyDown = null;
    this.DelPaste = null;
    this.DelChange = null;
    this.Pego = false;
    this.RangoHasta = null;
    this.RangoDesde = null;
    this.CssError = null;
    this.CssCorrecto = null;
    this.PermiteCero = null;
    this.DelValida = null;

}

MoniMisi2.Numero.prototype = {
    initialize: function() {
        MoniMisi2.Numero.callBaseMethod(this, 'initialize');
        this.DelFoco = Function.createDelegate(this, this.onFocus);
        this.DelBlur = Function.createDelegate(this, this.onBlur);
        this.DelKeyDown = Function.createDelegate(this, this.onKeyDown);
        this.DelPaste = Function.createDelegate(this, this.onPaste);
        this.DelChange = Function.createDelegate(this, this.onChange);
        this.DelValida = Function.createDelegate(this, this.ValidaRangos);

        $addHandler(this.get_element(), 'focus', this.DelFoco);
        $addHandler(this.get_element(), 'blur', this.DelBlur);
        $addHandler(this.get_element(), 'keydown', this.DelKeyDown);
        $addHandler(this.get_element(), 'paste', this.DelPaste);
        $addHandler(this.get_element(), 'propertychange', this.DelChange);
        $addHandler(this.get_element(), 'input', this.DelChange);
        this.add_Validando(this.DelValida)

        this.Prefijo = "";
        this.Espacios = "                                   ".replace(/ /g, this.Relleno);
        this.get_element().style.textAlign = "right";
        this.Ajustar(this.get_element(), this.Enteros, this.Decimales);
        this.Funciones.InitValidarControl(this);

    },
    dispose: function() {

        $clearHandlers(this.get_element());
        MoniMisi2.Numero.callBaseMethod(this, 'dispose');
    },

    onPaste: function(evento) {
        this.Pego = true;
    },

    onChange: function(evento) {
        if (this.Pego) {
            this.Pego = false;
            var TextoSucio = this.get_element().value
            this.get_element().value = "";
            this.Ajustar(this.get_element(), this.Enteros, this.Decimales);
            this.PosicionarCursor(this.get_element(), 1)
            for (Letra = 0; Letra < TextoSucio.length; Letra = Letra + 1) {
                var Tec = TextoSucio.charCodeAt(Letra);
                this.MascaraFox(this.get_element(), this.Enteros, this.Decimales, evento, Tec);
            }
            evento.preventDefault()
        };
    },

    MascaraFox: function(pTexto, pEnteros, pDecimales, evento, pTecla) {
        pEnteros = pEnteros + this.Signo.length;
        if (pDecimales == 0) {
            this.PuntoDecimal = "";
        }
        var Permitidos = "0123456789`abcdefghi"
        var MovimientosPermitidos = ",8,9,127,110,39,37,35,36,45,188,190,219,109,189,";
        evento = (evento || window.event);
        var Tecla;
        if (pTecla == undefined) {
            Tecla = evento.keyCode;
        } else {
            Tecla = pTecla;
        }

        if (Tecla >= 96 && Tecla <= 105) { Tecla = Tecla - 48 };

        if (Permitidos.indexOf(String.fromCharCode(Tecla)) != -1 || MovimientosPermitidos.indexOf("," + Tecla + ",") != -1) {

            var EstaEn = "";
            var PosCur = this.PosicionCursor(pTexto)
            if (PosCur == 0) { PosCur = 1 };
            if (PosCur >= pEnteros) {
                if (Tecla != 8) {
                    EstaEn = "Decimales";
                    if (PosCur == pEnteros) {
                        PosCur = PosCur + 1;
                    }
                    PosCur = PosCur - pEnteros - 1

                } else {
                    if (PosCur == pEnteros) {
                        EstaEn = "Enteros";
                    } else {
                        PosCur = PosCur - pEnteros - 1;
                        EstaEn = "Decimales";
                    }
                }
            } else {
                EstaEn = "Enteros";
            }

            var Entero = pTexto.value.substr(0, pEnteros);
            var Decimal = pTexto.value.substr(pEnteros + 1, pDecimales);

            switch (Tecla) {
                case 109: case 189: // signo menos
                    if (this.PermiteNegativos) {
                        var SignoAnterior = this.Signo;
                        if (SignoAnterior == "-") {
                            this.Signo = " ";
                        } else {
                            this.Signo = "-";
                        }
                        pTexto.value = this.Signo + pTexto.value.substr(1, pEnteros + pDecimales);
                        this.PosicionarCursor(pTexto, PosCur);
                    }
                    evento.preventDefault();
                    break;
                case 9: //Tab
                    this.Ajustar(pTexto, pEnteros - 1, pDecimales);
                    break;
                case 45: // Insert
                    if (pTexto.Insertando != undefined) {
                        if (pTexto.Insertando == 1) { pTexto.Insertando = 0; } else { pTexto.Insertando = 1; }
                    } else {
                        pTexto.Insertando = 1;
                    }
                    break;
                case 8: // Backspace
                    var Seleccionado = this.Seleccion(pTexto)
                    if (Seleccionado.Largo == 0) {
                        if (PosCur >= 1) {
                            if (EstaEn == "Decimales") {
                                pTexto.value = Entero + this.PuntoDecimal + Decimal.substr(0, PosCur - 1) + "0" + Decimal.substr(PosCur, pDecimales - PosCur)
                                if (PosCur == 1) {
                                    PosCur = PosCur + pEnteros - 1;
                                } else {
                                    PosCur = PosCur + pEnteros;
                                }
                            }
                            else {
                                if (PosCur > 1) {
                                    pTexto.value = this.Signo + Entero.substr(1, PosCur - 2) + Entero.substr(PosCur, pEnteros - PosCur) + this.Relleno + this.PuntoDecimal + Decimal;
                                    PosCur = PosCur - 1
                                }
                            }
                            this.PosicionarCursor(pTexto, PosCur);
                        }
                    } else {
                        this.LimpiarSeleccion(pTexto, Seleccionado, pEnteros, pDecimales, EstaEn, "");
                        PosCur = Seleccionado.Inicio;
                        this.PosicionarCursor(pTexto, PosCur);

                    }
                    evento.preventDefault();
                    break;
                case 127: // Delete
                    var Seleccionado = this.Seleccion(pTexto)
                    if (Seleccionado.Largo == 0) {
                        if (PosCur < pEnteros) {
                            if (EstaEn == "Decimales") {
                                if (PosCur < pDecimales) {
                                    pTexto.value = Entero + this.PuntoDecimal + Decimal.substr(0, PosCur) + Decimal.substr(PosCur + 1, pDecimales - PosCur) + "0";
                                }
                            } else {
                                pTexto.value = Entero.substr(0, PosCur) + Entero.substr(PosCur + 1, pEnteros - PosCur) + this.Relleno + this.PuntoDecimal + Decimal;
                            }
                        }

                        if (EstaEn == "Decimales") {
                            PosCur = PosCur + pEnteros + 1;
                        }
                    } else {
                        this.LimpiarSeleccion(pTexto, Seleccionado, pEnteros, pDecimales, EstaEn, "");
                        PosCur = Seleccionado.Inicio;
                    }
                    this.PosicionarCursor(pTexto, PosCur);
                    evento.preventDefault();
                    break;
                case 36: // Inicio
                    this.PosicionarCursor(pTexto, 1);
                    evento.preventDefault();
                    break;
                case 35: // End
                    break;
                case 39: // Derecha
                    break;
                case 37: // Izquierda
                    if (this.PosicionCursor(pTexto) == 1) {
                        this.PosicionarCursor(pTexto, 1);
                        evento.preventDefault();
                    }
                    break;
                case 110: case 188: case 190: case 219: // Punto
                    this.Ajustar(pTexto, pEnteros - 1, pDecimales);
                    this.PosicionarCursor(pTexto, pEnteros + 1);
                    evento.preventDefault();
                    break;
                default:
                    var Seleccionado = this.Seleccion(pTexto)
                    if (Seleccionado.Largo > 0) {
                        this.LimpiarSeleccion(pTexto, Seleccionado, pEnteros, pDecimales, EstaEn, String.fromCharCode(Tecla));
                        this.PosicionarCursor(pTexto, Seleccionado.Inicio + 1);
                    } else {
                        if (pTexto.Insertando == undefined) {
                            pTexto.Insertando = 0;
                        }
                        if (EstaEn == "Decimales") {
                            pTexto.value = Entero + this.PuntoDecimal + (Decimal.substr(0, PosCur) + String.fromCharCode(Tecla) + Decimal.substr(PosCur + pTexto.Insertando, pDecimales - PosCur)).substr(0, pDecimales)
                            PosCur = PosCur + pEnteros + 1;
                        } else {
                            pTexto.value = (Entero.substr(0, PosCur) + String.fromCharCode(Tecla) + Entero.substr(PosCur + pTexto.Insertando, pEnteros - PosCur)).substr(0, pEnteros) + this.PuntoDecimal + Decimal;
                        }

                        this.PosicionarCursor(pTexto, PosCur + 1);
                    }
                    evento.preventDefault();
                    break;
            }
        } else {
            if (evento.ctrlKey) {
                if (!(Tecla == 88 || Tecla == 86 || Tecla == 67)) {
                    evento.preventDefault();
                } else {
                    if (Tecla == 86) {
                        this.onPaste(evento);
                    }
                }
            } else {
                evento.preventDefault();
            }
        }
    },

    MascaraCalc: function(pTexto, pEnteros, pDecimales, evento) {

        var Permitidos = "0123456789`abcdefghi";
        var MovimientosPermitidos = ",8,9,127,109,189,";
        var Tecla = evento.keyCode;
        if (Tecla >= 96 && Tecla <= 105) { Tecla = Tecla - 48 };
        if (Permitidos.indexOf(String.fromCharCode(Tecla)) != -1 || MovimientosPermitidos.indexOf("," + Tecla + ",") != -1) {
            if (Tecla != 9) { // Tab
                var RellenoRep = new RegExp(this.Relleno, "g");
                pTexto.value = pTexto.value.substr(1, pDecimales + pEnteros + 1)
                pTexto.value = pTexto.value.replace(this.PuntoDecimal, "").replace(RellenoRep, "").replace(this.Prefijo, "");
                if (Tecla != 8 && Tecla != 127) { // Delete
                    if (Tecla != 109 && Tecla != 189) { // Signo
                        if (pTexto.value.length < pDecimales + pEnteros) { // Cualquier Numero
                            pTexto.value = (pTexto.value + String.fromCharCode(Tecla))
                        }
                    } else {
                        if (this.PermiteNegativos) {
                            var SignoAnterior = this.Signo;
                            if (SignoAnterior == "-") {
                                this.Signo = " ";
                            } else {
                                this.Signo = "-";
                            }
                        };
                    }
                } else {
                    pTexto.value = pTexto.value.substr(0, pTexto.value.length - 1);
                }
                var PosPunto = pTexto.value.length - pDecimales;
                pTexto.value = pTexto.value.substr(0, PosPunto) + "." + pTexto.value.substr(PosPunto, pTexto.value.length - PosPunto);
                var Numero = 0;
                if (pTexto.value.replace(RellenoRep, "") != ".") {
                    Numero = new Number(pTexto.value.replace(RellenoRep, ""));
                };

                pTexto.value = String(Numero.toFixed(pDecimales)).replace(/ /g, "").replace(".", this.PuntoDecimal);
                pTexto.value = this.Prefijo + this.Signo + this.Espacios.substr(0, pEnteros + pDecimales + 1 - pTexto.value.length) + pTexto.value;
                evento.preventDefault();
            }
        } else {
            evento.preventDefault();
        }

    },

    Ajustar: function(pTexto, pEnteros, pDecimales) {

        var RellenoRep = new RegExp(this.Relleno, "g");
        var Tex = pTexto.value.replace(RellenoRep, "")
        if (pDecimales != 0) {
            Tex = Tex.replace(this.PuntoDecimal, ".");
        }
        var Numero = new Number('0')
        if (Tex != '.') {
            Numero = new Number(Tex);
        }

        if (Numero >= 0) {
            this.Signo = " ";
        } else {
            this.Signo = "-";
            Numero = Numero * (-1);
        }
        pTexto.value = String(Numero.toFixed(pDecimales)).replace(/ /g, "").replace(".", this.PuntoDecimal);
        pTexto.value = this.Signo + this.Espacios.substr(0, pEnteros + pDecimales + 1 - pTexto.value.length) + pTexto.value;

    },

    PosicionCursor: function(pTexto) {

        if (document.selection && !window.getSelection) {
            var rango = document.selection.createRange().duplicate()
            rango.moveEnd('character', pTexto.value.length)
            if (rango.text == '') return pTexto.value.length
            return pTexto.value.lastIndexOf(rango.text)
        } else {
            return pTexto.selectionStart
        }


    },

    onFocus: function(e) {
        this.Ajustar(this.get_element(), this.Enteros, this.Decimales, e);
        this.PosicionarCursor(this.get_element(), null);
    },

    onKeyDown: function(e) {
        if (this.Tipo == "Fox") {
            this.MascaraFox(this.get_element(), this.Enteros, this.Decimales, e);
        } else {
            this.MascaraCalc(this.get_element(), this.Enteros, this.Decimales, e);
        }
    },

    onBlur: function(e) {
        if (this.Tipo == "Fox") {
            this.Ajustar(this.get_element(), this.Enteros, this.Decimales, e);
        };
        this.Validar()
    },

    Validar: function() {
        this.Funciones.ValidarControl(this, this.get_value());
    },

    ValidaRangos: function(sender, e) {
        if (e.Valor == 0 && !sender.PermiteCero) {
            e.Mensajes.push("no puede ser cero")
            e.Erroneo = true;
        }

        if (e.Valor < this.RangoDesde) {
            e.Mensajes.push("debe ser mayor o igual a " + this.RangoDesde )
            e.Erroneo = true;
        }

        if (e.Valor > this.RangoHasta) {
            e.Mensajes.push("debe ser menor o igual a " + this.RangoHasta )
            e.Erroneo = true;
        }
    },

    Seleccion: function Seleccion(pTexto) {
    if (document.selection && !window.getSelection) {
            var rango = document.selection.createRange().duplicate();
            var LargoSeleccion = rango.text.length;
            rango.moveEnd('character', pTexto.value.length);

            if (pTexto.value.lastIndexOf(rango.text) == 0) {
                return { Inicio: 1, Largo: LargoSeleccion }
            } else {
                return { Inicio: pTexto.value.lastIndexOf(rango.text), Largo: LargoSeleccion };
            }

        } else {
            if (pTexto.selectionStart == 0) {
                return { Inicio: 1, Largo: pTexto.selectionEnd - pTexto.selectionStart };
            } else {
                return { Inicio: pTexto.selectionStart, Largo: pTexto.selectionEnd - pTexto.selectionStart };
            }

        }
    },

    LimpiarSeleccion: function LimpiarSeleccion(pTexto, pSeleccionado, pEnteros, pDecimales, pEstaEn, pReemplazo) {

        var LargoReemplazo = pReemplazo.length;
        var Limpiar = pTexto.value.substr(pSeleccionado.Inicio, pSeleccionado.Largo);
        var LimpiarEntero = ""
        var LimpiarDecimal = ""
        if (Limpiar.lastIndexOf(this.PuntoDecimal) != -1) {
            LimpiarEntero = Limpiar.substr(0, Limpiar.lastIndexOf(this.PuntoDecimal));
            LimpiarDecimal = Limpiar.substr(Limpiar.lastIndexOf(this.PuntoDecimal) + 1, Limpiar.length - (Limpiar.lastIndexOf(this.PuntoDecimal)) + 1);
            pTexto.value = pTexto.value.substr(0, pSeleccionado.Inicio) + pReemplazo + this.Espacios.substr(0, LimpiarEntero.length - LargoReemplazo) + this.PuntoDecimal + "0000000000000".substr(0, LimpiarDecimal.length) + pTexto.value.substr(pEnteros + 1 + LimpiarDecimal.length, pTexto.value.length - (pEnteros + 1 + LimpiarDecimal.length));
        } else {
            if (pEstaEn == "Decimales") {
                var Decimales = pTexto.value.substr(pEnteros + 1, pDecimales);
                pSeleccionado.Inicio = pSeleccionado.Inicio - (pEnteros + 1);
                Decimales = Decimales.substr(0, pSeleccionado.Inicio) + pReemplazo + "0000000000000".substr(0, pSeleccionado.Largo - LargoReemplazo) + Decimales.substr(pSeleccionado.Inicio + pSeleccionado.Largo, 100);
                pTexto.value = pTexto.value.substr(0, pEnteros) + this.PuntoDecimal + Decimales;
                pSeleccionado.Inicio = pSeleccionado.Inicio + (pEnteros + 1);
            } else {
                pTexto.value = pTexto.value.substr(0, pSeleccionado.Inicio) + pReemplazo + this.Espacios.substr(0, pSeleccionado.Largo - LargoReemplazo) + pTexto.value.substr(pSeleccionado.Inicio + pSeleccionado.Largo, pTexto.value.length - (pSeleccionado.Inicio + pSeleccionado.Largo));
            }
        }

    },

    PosicionarCursor: function(pTexto, pPos) {

    if (document.selection && !window.getSelection) {
            var rango = pTexto.createTextRange();
            if (pPos == null) {
                rango.moveStart('character', 0);
                rango.moveEnd('character', pTexto.value.length);
            } else { rango.move('character', pPos) };
            rango.select();
        } else {
            pTexto.focus();
            pTexto.setSelectionRange(pPos, pPos);
        }
    },

    get_Enteros: function() {
        return this.Enteros;
    },

    set_Enteros: function(value) {
        if (this.Enteros !== value) {
            this.Enteros = value;
            this.raisePropertyChanged('Enteros');
        }
    },

    get_Decimales: function() {
        return this.Decimales;
    },

    set_Decimales: function(value) {
        if (this.Decimales !== value) {
            this.Decimales = value;
            this.raisePropertyChanged('Decimales');
        }
    },

    get_Tipo: function() {
        return this.Tipo;
    },

    set_Tipo: function(value) {
        if (this.Tipo !== value) {
            this.Tipo = value;
            this.raisePropertyChanged('Tipo');
        }
    },

    get_Relleno: function() {
        return this.Relleno;
    },

    set_Relleno: function(value) {
        if (this.Relleno !== value) {
            this.Relleno = value;
            this.raisePropertyChanged('Relleno');
        }
    },

    get_PermiteNegativos: function() {
        return this.PermiteNegativos;
    },

    set_PermiteNegativos: function(value) {
        if (this.PermiteNegativos !== value) {
            this.PermiteNegativos = value;
            this.raisePropertyChanged('PermiteNegativos');
        }
    },

    set_value: function(value) {
        this.get_element().value = value;
        this.Ajustar(this.get_element(), this.Enteros, this.Decimales);
        this.Validar();

    },
    get_value: function() {
        var RellenoRep = new RegExp(this.Relleno, "g");
        var Tex = this.get_element().value.replace(RellenoRep, "")
        if (this.Decimales != 0) {
            Tex = Tex.replace(this.PuntoDecimal, ".");
        }
        var Numero = new Number('0')
        if (Tex != '.') {
            Numero = new Number(Tex);
        }
        return Numero.valueOf();

    },

    get_RangoDesde: function() {
        return this.RangoDesde;
    },

    set_RangoDesde: function(value) {
        if (this.RangoDesde !== value) {
            this.RangoDesde = value;
            this.raisePropertyChanged('RangoDesde');
        }
    },
    get_RangoHasta: function() {
        return this.RangoHasta;
    },
    set_RangoHasta: function(value) {
        if (this.RangoHasta !== value) {
            this.RangoHasta = value;
            this.raisePropertyChanged('RangoHasta');
        }
    },


    get_PermiteCero: function() {
        return this.PermiteCero;
    },
    set_PermiteCero: function(value) {
        if (this.PermiteCero !== value) {
            this.PermiteCero = value;
            this.raisePropertyChanged('PermiteCero');
        }
    },

    get_CssError: function() {
        return this.CssError;
    },

    set_CssError: function(value) {
        if (this.CssError !== value) {
            this.CssError = value;
            this.raisePropertyChanged('CssError');
        }
    },
    add_Validando: function(handler) {
        this.get_events().addHandler('Validando', handler);
    },
    remove_Validando: function(handler) {
        this.get_events().removeHandler('Validando', handler);
    }
}
MoniMisi2.Numero.registerClass('MoniMisi2.Numero', Sys.UI.Control);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();